基于邻接表的图的深度和广度优先搜索遍历

/*****头文件Graph.h**********/
#define MAX_VERTEX 20
#define GQSIZE 20

#include<iostream>
using namespace std;

typedef char VertexType;  //各个结构体的定义

typedef struct ANode{
	int AdjVex;
	struct ANode *NextArc;
}ArcNode;

typedef struct VNode{
	VertexType Data;
	ArcNode *FirstArc;
}VerNode,AdjList[MAX_VERTEX];

typedef struct Graph{
	AdjList Vertices;   //相当于VerNode Vertices[MAX_VERTEX];
	int VerNum, ArcNum;	
}ALGraph;

typedef struct Queue{
	int Base[GQSIZE];
	int front, rear;
}GCQueue;

int LocateVex(ALGraph G, VertexType V)
{
	int i = 0;
	while (i<G.VerNum && V!=G.Vertices[i].Data)
	{
		i++;
	}
	if (i < G.VerNum)
		return i;
	else
	{
		return -1;
	}
}

void CreateGraph(ALGraph &G)   //创建无向图(包括生成相应的邻接表)
{
	int VNum, ANum;
	VertexType V1, V2;
	cout << "请分别输入顶点数和边数:" << endl;
	cin >> VNum >> ANum;
	G.VerNum = VNum;
	G.ArcNum = ANum;
	cout << "请输入各顶点:" << endl;
	for (int i = 0; i != G.VerNum; i++)
	{
		cin >> G.Vertices[i].Data;
		G.Vertices[i].FirstArc = NULL;
	}
	for (int j = 0; j != G.ArcNum; j++)
	{
		cout << "请输入边所在的两顶点:" << endl;
		cin >> V1 >> V2;
		int k = LocateVex(G, V1);
		int l = LocateVex(G, V2);

		if (k >= 0 && l >= 0)
		{
			ArcNode *P = (ArcNode*)malloc(sizeof(ArcNode));
			P->AdjVex = l;
			P->NextArc = NULL;
			if (!G.Vertices[k].FirstArc)
				G.Vertices[k].FirstArc = P;
			else
			{
				ArcNode *L = G.Vertices[k].FirstArc;
				while (L->NextArc)
				{
					L = L->NextArc;
				}
				L->NextArc = P;
			}

			ArcNode *Q = (ArcNode*)malloc(sizeof(ArcNode)); //无向图一条边关联两个顶点,要是创建有向图则这段代码可不要
			Q->AdjVex = k;
			Q->NextArc = NULL;
			if (!G.Vertices[l].FirstArc)
				G.Vertices[l].FirstArc = Q;
			else
			{
				ArcNode *M = G.Vertices[l].FirstArc; 
				while (M->NextArc)
				{
					M = M->NextArc;
				}
				M->NextArc = Q;
			}
		}
		else
			cout << "没有这条边!!" << endl;
	}

	cout << endl;
	cout << "输出邻接表:" << endl;
	for (int i = 0; i != G.VerNum; i++)
	{
		cout <<i << G.Vertices[i].Data;
		ArcNode *H = G.Vertices[i].FirstArc;
		while (H)
		{
			cout <<"->"<< H->AdjVex;
			H = H->NextArc;
		}
		cout << endl;
	}
}

int FirstAdjvex(ALGraph G, int v)  //查找第一个邻接点
{
	if (G.Vertices[v].FirstArc)
		return G.Vertices[v].FirstArc->AdjVex;
	else return -1;
}

int NextAdjvex(ALGraph G, int v, int w)  //查找下一个邻接点
{
	int flag = 0;
	ArcNode *P = G.Vertices[v].FirstArc;
	while (P)
	{
		if (P->AdjVex == w)
		{
			flag = 1;
			break;
		}
		else
			P = P->NextArc;
	}
	if (flag&&P->NextArc)
		return P->NextArc->AdjVex;
	else return -1;
}

bool Visited[MAX_VERTEX];
void DFS(ALGraph G, int v)  //递归的深度优先搜索
{
	Visited[v] = true;
	cout << G.Vertices[v].Data << " ";
	for (int w = FirstAdjvex(G, v); w >= 0; w = NextAdjvex(G, v, w))
	{
		if (!Visited[w])
			DFS(G, w);
	}
}
void DFSTraverse(ALGraph G)
{
	for (int v = 0; v != G.VerNum; v++)   //此处for语句不可和下面for语句合并,这是先前的初始化,放在下面会导致初始化前就会被赋值
	{
		Visited[v] = false;              
	}
	for (int v = 0; v !=G.VerNum; v++)
	{
		if (!Visited[v])
			DFS(G, v);
	}
	cout << endl;
}

void BFSTraverse(ALGraph G)  //基于队列的广度优先搜索
{
	GCQueue Q;
	Q.front = Q.rear = 0;
	for (int v = 0; v != G.VerNum; v++)
	{
		Visited[v] = false;
	}
	for (int v = 0; v != G.VerNum; v++)
	{
		if (!Visited[v])
		{
			Visited[v]=true;
			cout << G.Vertices[v].Data << " ";
			if (((Q.rear + 1) % GQSIZE) == Q.front)
			{
				cout << "队满,不能入队!!!" << endl;
				return;
			}
			Q.Base[Q.rear] = v;
			Q.rear = (Q.rear + 1) % GQSIZE;
			
			while (Q.rear!=Q.front)
			{
				int u = Q.Base[Q.front];
				Q.front = (Q.front + 1) % GQSIZE;
				for (int w = FirstAdjvex(G, u); w >= 0; w = NextAdjvex(G, u, w))
				{
					if (!Visited[w])
					{
						Visited[w] = true;
						cout << G.Vertices[w].Data << " ";
						if (((Q.rear + 1) % GQSIZE) == Q.front)
						{
							cout << "队满,不能入队!!!" << endl;
							return;
						}
						Q.Base[Q.rear] = w;
						Q.rear = (Q.rear + 1) % GQSIZE;

					}
				}

			}

		}
	}
}

/****************主函数文件GraphDB.cpp*************/
#include<iostream>
#include<cstring>

#include "Graph.h"
using namespace std;

int main()
{
	ALGraph G;
	CreateGraph(G);
	cout << "深度优先遍历为:";
	DFSTraverse(G);
	cout << endl;
	cout << "广度优先遍历为:";
	BFSTraverse(G);
	cout << endl;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值